package resp

import (
	"strings"
)

type Frame struct {
	flag FrameFlag
	data []byte
}

func InitFrame(data []byte) Frame {
	f := Frame{data: data}
	if len(f.data) > 0 {
		f.flag = FrameFlag(f.data[0])
	}
	return f
}

type ArrayFrame struct {
	count  int
	offset int
	cmd    string
	args   []string
	Frame
}

func (f *ArrayFrame) ParseHead() int {
	var idx, size int
	if f.count, idx = GetNum(f.data, 0); idx < 0 {
		return idx
	}
	if size, idx = GetNum(f.data, idx); idx < 0 {
		return idx
	}
	f.offset = idx + size + 2
	f.cmd = strings.ToUpper(string(f.data[idx : f.offset-2]))
	return f.offset
}

func (f *ArrayFrame) Count() int {
	if f.offset == 0 {
		f.ParseHead()
	}
	return f.count
}

func (f *ArrayFrame) Cmd() string {
	if f.offset == 0 {
		f.ParseHead()
	}
	return f.cmd
}

func (f *ArrayFrame) Arg(n int) string {
	if cmd := f.Cmd(); n <= 0 { // 执行初始化
		return cmd
	}
	var i, idx, size int
	for i = len(f.args); i < n; i++ {
		if size, idx = GetNum(f.data, f.offset); idx < 0 {
			break
		}
		arg := string(f.data[idx : idx+size])
		f.args = append(f.args, arg)
		f.offset = idx + size + 2
	}
	if i >= n {
		return f.args[n-1]
	}
	return ""
}
